<?php
/**
 * 应用控制器,协调处理用户请求,处理,跳转分发等工作.
 *
 * @author Qiong Wu <papa0924@gmail.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.windframework.com
 *
 * @version $Id: WindWebApplication.php 3859 2012-12-18 09:25:51Z yishuo $
 */
class WindWebApplication extends AbstractWindApplication
{
    /**
     * 委派器.
     *
     * @var WindDispatcher
     */
    protected $dispatcher = null;

    /* (non-PHPdoc)
     * @see AbstractWindApplication::doDispatch()
     */
    public function doDispatch($forward, $display = false)
    {
        if ($forward === null) {
            return;
        }
        if ($this->dispatcher === null) {
            $this->dispatcher = $this->factory->getInstance(
            'dispatcher');
        }
        $this->dispatcher->dispatch($forward, $this->handlerAdapter, $display);
    }

    /* (non-PHPdoc)
     * @see AbstractWindApplication::sendErrorMessage()
     */
    protected function sendErrorMessage($errorMessage, $errorcode)
    {
        if (!is_object($errorMessage)) {
            $_tmp = $errorMessage;
            /* @var $errorMessage WindErrorMessage */
            $errorMessage = Wind::getComponent('errorMessage');
            $errorMessage->addError($_tmp);
        }
        /* @var $router WindRouter */
        $moduleName = $this->handlerAdapter->getModule();
        if ($moduleName === 'error') {
            throw new WindFinalException($errorMessage->getError(0));
        }

        if (!$_errorAction = $errorMessage->getErrorAction()) {
            $module = $this->getModules($moduleName);
            $_errorClass = Wind::import(@$module['error-handler']);
            $_errorAction = 'error/'.$_errorClass.'/run/';
            $this->setModules('error',
                array(
                    'controller-path'   => array_search($_errorClass, Wind::$_imports),
                    'controller-suffix' => '',
                    'error-handler'     => '', ));
        }
        /* @var $forward WindForward */
        $forward = Wind::getComponent('forward');
        $error = array('message' => $errorMessage->getError(), 'code' => $errorcode);
        $forward->forwardAction($_errorAction,
            array('__error' => $error, '__errorDir' => $this->getConfig('error-dir')), false, false);
        $this->doDispatch($forward);
    }
}
